const utils = (function () {
  return {
    formatDate: formatDate,
    formatTime:formatTime,
    formatDay:formatDay,
    exportExcel: exportExcel,
    isEmail: isEmail,
    isMobile: isMobile,
    linkTo: linkTo,
    storage: storage,
    removeStorage: removeStorage,
    getParam: getParam,
    isUrl:isUrl,
    isHttp:isHttp,
    isCname:isCname,
    betweenDays:betweenDays,
    identifyPwd:identifyPwd,
    isQuantity:isQuantity,
    isColor:isColor,
    isCom:isCom,
    disabledDate:disabledDate,
    getUrl:getUrl,
    isChinEngNum:isChinEngNum
  }
  function isChinEngNum(value){
    const regExp  = /^[\u4E00-\u9FA5A-Za-z0-9]+$/
    return regExp.test(value)
  }
  function getUrl(api,obj){
    let url = api+'?'
    let uri = []
    for(let key in obj){
      uri.push(key+'='+obj[key])
    }
    return url += uri.join('&')
  }
  //时间跨度30天限制
  function disabledDate(){
    return {
      disabledDate(date){
        return date.getTime()>=Date.now()
      }
    }
  }
  //验证数字
  function isQuantity(quantity){
    const regExp = /^[0-9]*$/
    return regExp.test(quantity)
  }

  //验证颜色编码
  function isColor(color){
    const regExp =/^#([0-9a-fA-F]{6}|[0-9a-fA-F]{3})/
    return regExp.test(color)
  }

  //验证密码
  function identifyPwd(pwd){
    const regExp = /^[A-Za-z0-9_]{5,16}$/
    return regExp.test(pwd)
  }
  //两个日期之间的天数
  function betweenDays(endDate, startDate) { //sDate1和sDate2是2017-9-25格式
    var aDate, oDate1, oDate2, iDays
    aDate = endDate.split("-")
    oDate1 = new Date(aDate[1] + '-' + aDate[2] + '-' + aDate[0]) //转换为9-25-2017格式
    aDate = startDate.split("-")
    oDate2 = new Date(aDate[1] + '-' + aDate[2] + '-' + aDate[0])
    iDays = parseInt(Math.abs(oDate1 - oDate2) / 1000 / 60 / 60 / 24) //把相差的毫秒数转换为天数
    return iDays
  }
  //检验域名的格式（可以是http也可以是字母开头的情况）
  function isUrl(url){
    const reg = /^((http|https):\/\/)|([A-Za-z]\.)([\w.]+\/?)\S*/
    return reg.test(url)
  }
  //检验是否是http:// 或者 https:// 开头 (必须以协议头开头的场景)
  function isHttp(url){
    const reg = /^https?:\/\//i
    return reg.test(url)
  }
  //检验cname (不能是http:// 或者 https:// 开头的域名)
  function isCname(url){
    let flag = isHttp(url)
    if(flag){
      return false
    }
    const reg = /([A-Za-z]\.)([\w.]+\/?)\S*/
    return reg.test(url)
  }
  //完整域名校验
  function isCom(url){
    const reg =  /^(?=^.{3,255}$)[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+$/
    return reg.test(url)
  }

  // 日期格式化
  function formatDate(date, format) {
    if (!date) return '-'
    if (!(date instanceof Date)) {
      date = new Date(date);
    }
    var paddNum = function(num) {
        num += "";
        return num.replace(/^(\d)$/, "0$1");
      }
      //指定格式字符
    var cfg = {
      yyyy: date.getFullYear(), //年 : 4位
      yy: date.getFullYear().toString().substring(2), //年 : 2位
      M: date.getMonth() + 1, //月 : 如果1位的时候不补0
      MM: paddNum(date.getMonth() + 1), //月 : 如果1位的时候补0
      d: date.getDate(), //日 : 如果1位的时候不补0=
      dd: paddNum(date.getDate()), //日 : 如果1位的时候补0
      hh: paddNum(date.getHours()), //时
      mm: paddNum(date.getMinutes()), //分
      ss: paddNum(date.getSeconds()) //秒
    }
    format || (format = "yyyy-MM-dd hh:mm:ss");
    return format.replace(/([a-z])(\1)*/ig, function(m) {
      return cfg[m];
    })
  }

  // 日期格式化
  function formatTime(date, format) {
    if (!date) return '-'
    if (!(date instanceof Date)) {
      date = new Date(date);
    }
    var paddNum = function(num) {
        num += "";
        return num.replace(/^(\d)$/, "0$1");
      }
      //指定格式字符
    var cfg = {
      yyyy: date.getFullYear(), //年 : 4位
      yy: date.getFullYear().toString().substring(2), //年 : 2位
      M: date.getMonth() + 1, //月 : 如果1位的时候不补0
      MM: paddNum(date.getMonth() + 1), //月 : 如果1位的时候补0
      d: date.getDate(), //日 : 如果1位的时候不补0=
      dd: paddNum(date.getDate()), //日 : 如果1位的时候补0
    }
    format || (format = "yyyy-MM-dd");
    return format.replace(/([a-z])(\1)*/ig, function(m) {
      return cfg[m];
    })
  }

  // 日期格式化
  function formatDay(date, format) {
    if (!date) return '-'
    if (!(date instanceof Date)) {
      date = new Date(date);
    }
    var paddNum = function(num) {
        num += "";
        return num.replace(/^(\d)$/, "0$1");
      }
      //指定格式字符
    var cfg = {
      hh: paddNum(date.getHours()), //时
      mm: paddNum(date.getMinutes()), //分
      ss: paddNum(date.getSeconds()) //秒
    }
    format || (format = "hh:mm:ss");
    return format.replace(/([a-z])(\1)*/ig, function(m) {
      return cfg[m];
    })
  }
  

  //导出 Excel
  function exportExcel(url, param) {
    if (url.indexOf('.com') == -1) {
      url = $server + url
    }
    url = url + '?'
    for (var key in param) {
      if (param[key] !== '') {
        var oValue = param[key]
        if (typeof (oValue) != 'string') {
          oValue = JSON.stringify(oValue)
        }
        url = url + key + '=' + oValue + '&';
      }
    }
    linkTo(url)
  }

  // 判断是不是邮箱
  function isEmail(str) {
    return /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/.test(str)
  }

  // 判断是不是手机号
  function isMobile(n) {
    return (/^1[0-9]{10}$/).test(n)
  }

  // a 连接跳转
  function linkTo(url) {
    var a = document.createElement('a')
    a.href = url
    a.target = '_blank'
    a.click()
  }

  function storage(key, data) {
    var obj = JSON.parse(localStorage.getItem('util_storage')) || {};
    if (data || ['', 0, false].indexOf(data) > -1) {
      obj[key] = data;
      localStorage.setItem('util_storage', JSON.stringify(obj));
    } else {
      if (key) {
        return obj[key] || '';
      } else {
        return obj;
      }
    }
  }

  function removeStorage(key) {
    var obj = JSON.parse(localStorage.getItem('util_storage')) || {};
    if (key) {
      delete obj[key];
      localStorage.setItem('util_storage', JSON.stringify(obj));
    } else {
      localStorage.removeItem('util_storage');
    }
  }

  // 获取url带的参数
  function getParam (name) {
    var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
    //var r = window.location.search.substr(1).match(reg);
    var tmp = window.location.href.split('?');
    if(tmp.length <= 1) return null;
    var r = tmp[tmp.length-1].match(reg);

    if (r != null) {
      return unescape(r[2]);
    } else {
      return null;
    }
  }
})()

export default {
  install(Vue) {
    Vue.prototype.$utils = utils
  }
}
